#ifndef USBRECEIVE_H
#define USBRECEIVE_H

#include<Windows.h>
#include "../usblib/inc/CyAPI.h"
static GUID CYUSBDRV_NEW_GUID ={0xa0180bd0, 0x5c65, 0x4098, 0x8f, 0x9b, 0x50, 0x8d, 0x1a, 0x98, 0x21, 0xbc};

enum DRIVER_VERSION
{
    DRIVER_VERSION_20=0x3040204,
};
enum Type
{
    DZ=0,
    HF,
    VHF,
    HF15360K,
    HF2013,
    NEWHF,
    HF2016_NSSC,
    UN
};
#define VALUE(ad,val) ((((unsigned short)ad)<<8)|(val))
/************************************************************************/
    /* 参数地址对照表
    |地址|              |                     说明                       |
    9                           开始结束设置【0:结束;0xFF:开始】
    10                          设置接收机滤波器组(MHz)【<2.95:0;<4.55:1,<7.15:2;<11.35:3;<19.15:4;<32.35:5;<58.05:6;>58.05:7】
    15                          触发设置【0xAA:GPS触发;0x55:不触发】
    17                          设置接收端开关状态【MSW0161:第2为置1；ADG901:第1为置1】
    18                          射频压制开关设置【MSW0161:第1为置1；ADG901:第0为置1】
    20                          自动增益控制【0:否;1:是】
    30                          线性调频
    31-34                        发送通道频率[H-L]
    35                          发送通道模式：2=RF，4:只修改频率，模式不变
    36-39                        本振频率[H-L]
    40                          本振模式1：1=LO, 4:只修改频率，模式不变
    41                            脉宽
    42                            码宽
    43-44                        码长[L-H]
    45-46                        循环间隔（空脉冲间隔）
    47-48                        用于传输1Byte数据(用于加载M序列，规则：16位数据，第12为码，后几位为码序号，其它位置0)
    49                          本振开关状态
    50                          发射开关状态
    51                          触发时间：时
    52                          触发时间：分
    53                          触发时间：秒
    54                          码类型：0，M序列；1，8位互补码；2,16位互补码
    55                          触发类型：0，不触发；1，触发模式1；3，触发模式2
    56                          GPS复位：0，不复位；1，复位
    57                          工作模式：1，非法；2，单音；3，探测；4，关闭
    58-59                       发射时间[L-H]：单位：100ms
    60-61                        单频点工作时间[L-H]:单位：100ms
    */
    /************************************************************************/
enum ADDR_OF_PARAM
{
    ADDR_OF_STARTANDSTOP=9,
    ADDR_OF_RECEIVERFILTER=10,
    ADDR_OF_LOFILTER=11,
    ADDR_OF_TRGTYPEOLD=15,
    ADDR_OF_RECEIVERSW=17,
    ADDR_OF_RFSW=18,
    ADDR_OF_AUTOGAIN=20,
    ADDR_OF_LTRANSDELAY=30,
    ADDR_OF_TRFREQ4=31,
    ADDR_OF_TRFREQ3=32,
    ADDR_OF_TRFREQ2=33,
    ADDR_OF_TRFREQ1=34,
    ADDR_OF_TRMODE=35,
    ADDR_OF_LOFREQ4=36,
    ADDR_OF_LOFREQ3=37,
    ADDR_OF_LOFREQ2=38,
    ADDR_OF_LOFREQ1=39,
    ADDR_OF_LOMODE=40,
    ADDR_OF_PLUSEWIDTH=41,
    ADDR_OF_CODEWIDTH=42,
    ADDR_OF_CODELENGTH1=43,
    ADDR_OF_CODELENGTH2=44,
    ADDR_OF_NULLPLUSEWIDTH1=45,
    ADDR_OF_NULLPLUSEWIDTH2=46,
    ADDR_OF_SENDBYTE1=47,
    ADDR_OF_SENDBYTE2=48,
    ADDR_OF_LOSW=49,
    ADDR_OF_TRSW=50,
    ADDR_OF_TRGHOUR=51,
    ADDR_OF_TRGMINUTE=52,
    ADDR_OF_TRGSECOND=53,
    ADDR_OF_CODETYPE=54,
    ADDR_OF_TRGTYPE=55,
    ADDR_OF_GPSRESET=56,
    ADDR_OF_WORKMODE=57,
    ADDR_OF_TRTIME1=58,
    ADDR_OF_TRTIME2=59,
    ADDR_OF_TRWHOLETIME1=60,
    ADDR_OF_TRWHOLETIME2=61,
};
/*
    Request Code:
    0xB3 // enable interrupt trans使能中断IN传输
    0xB4 // disenable interrupt trans非使能中断IN传输
    0xB7 //pc,pe输出数据和地址，wr ，databuffer[]:数据、地址、数据、地址
    0xB8//SET,GET TRIGTIME ,READ GPS TIME;
    0xB9 //读取GPS板信息 ,include control data from GPSboard ,60 byte
    0xBA //读取fifo 状态 and INT0 中断状态， 2 BYTE
    0xD9  //设置FGPA控制信息，不需要将地址 *4+2 数据IOC = SETUPDAT[2]; 地址 IOE = SETUPDAT[3];
    0xDA    //设置FGPA控制信息，数据IOC = SETUPDAT[2]; 地址 IOE = SETUPDAT[3];
    0xDB    //设置老机器 HF系统 GPS触发时间 3BYTE
    0xDC   //读取老机器 HF系统 GPS触发时间 3BYTE
    0xDD   //读取来自GSP的时间信息，时、分、秒 3BYTE
    0xDE   //清空ENDpoint6 FIFO
    0xEA  //串口设置接收机，老 HF 系统
    0xEB  ////串口接收机返回信息，老 HF 系统
    0xEC  //软件复位USB board ，CPUCS = CPUCS & (~bmBIT0) ;
    */
enum REQ_CODE
{
    REQ_OF_INTERRUPT_TRANSFORM_EN=0xB3,
    REQ_OF_INTERRUPT_TRANSFORM_DISABLE=0xB4,
    REQ_OF_BULK_WRITE_CTRLEP=0xB7,
    REQ_OF_READ_GPSTIME_AND_TRGTIME_3=0xB8,
    REQ_OF_READ_GPS_AND_HARDDEVICE_STATE_60=0xB9,
    REQ_OF_READ_FIFO_AND_INTERRUPT0_STATE=0xBA,
    REQ_OF_SET_FPGA_CTRL_NONSELFPLUSE=0xD9,
    REQ_OF_SET_FPGA_CTRL_SELFPLUSE=0xDA,
    REQ_OF_SET_HF_TRGTIME_3=0xDB,
    REQ_OF_READ_HF_TRGTIME_3=0xDC,
    REQ_OF_READ_HF_GPSTIME_3=0xDD,
    REQ_OF_RESET_FIFO=0xDE,
    REQ_OF_SET_RECEIVER_BY_COM=0xEA,
    REQ_OF_RET_OF_RECEIVER_BY_COM=0xEB,
    REQ_OF_SOFT_RESET_USBBOARD=0xEC
};
enum PID_AND_VID
{
    PID_OF_HF=0x1142,
    VID_OF_HF=0x0632,
    PID_OF_newHF=0x1143,
    VID_OF_newHF=0x0632,
    PID_OF_VHF=0x1145,
    VID_OF_VHF=0x0632,
    PID_OF_HF2013=0X1147,
    VID_OF_HF2013=0X0632,
    PID_OF_HF15360K=0x1144,
    VID_OF_HF15360K=0x0632,
    PID_OF_HF2016_NSSC_=0x1107,//空间中心
    VID_OF_HF2016_NSSC =0x0633,//空间中心
};

class Receiver
{
 public:
    Receiver(void);
    virtual ~Receiver(void);
  protected:
    //USB指针类
    CCyUSBDevice* m_pUsbDevice;
    bool m_bOpen;
    HANDLE m_hEvent;

  public:

    Type m_hardType;
    bool usbOpen();
    bool ResetFIFO(void);
    bool DetectHardDevice(void);
    bool IsDeviceOpen(void);
     //控制端口直接控制命令写入
    bool WriteToCtrlEP(unsigned short nValue=0,unsigned short nIndex=0,
      unsigned short reqCode=REQ_OF_SET_FPGA_CTRL_SELFPLUSE,
      CTL_XFER_TGT_TYPE targetType=TGT_DEVICE,CTL_XFER_REQ_TYPE reqType=REQ_VENDOR,
      CTL_XFER_DIR_TYPE dirType=DIR_TO_DEVICE);
};

#endif // USBRECEIVE_H
